package org.example;


import org.example.MyRateLimiterFactory;
import org.example.myRateLimiter.MyRateLimiter;
import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

//限流器上下文 负责管理限流器和他们的所属
public class MyRateLimiterContext {

    @Autowired
    private MyRateLimiterFactory myRateLimiterFactory;

    //根据method获取限流器
    private final Map<Method, MyRateLimiter> myRateLimiterMap = new ConcurrentHashMap<>();


    //根据method和name获取限流器 一个方法只有一个限流器 如果没有就根据name创建一个
    public MyRateLimiter getRateLimiter(Method method, String name, int capacity, int rate) {

        MyRateLimiter myRateLimiter;
        // 使用 ConcurrentHashMap 的 computeIfAbsent 方法来避免手动锁 该方法是
        myRateLimiter = myRateLimiterMap.computeIfAbsent(method, m -> {
            try {
                return myRateLimiterFactory.createRateLimiter(name, capacity, rate);
            } catch (Exception e) {
                throw new RuntimeException("限流器创建失败", e);
            }
        });


        System.out.println("创建新的限流器 当前限流器数量： " + myRateLimiterMap.size());
        return myRateLimiter;

    }

}
